/**
  * @file	iic.c
  *	@author	yoyoyes
  * @date	2023-6-6
  */
  
#include "iic.h"

/**
  * @func	iic_init
  * @param	none
  * @return	none
  */
void iic_init(void)
{
	rcu_periph_clock_enable(RCU_GPIOB);									/* GPIOB端口时钟使能 */
		
	gpio_init(GPIOB, GPIO_MODE_OUT_OD, GPIO_OSPEED_50MHZ, GPIO_PIN_6);	/* PB6引脚配置：开漏输出、50MHz */
	gpio_init(GPIOB, GPIO_MODE_OUT_OD, GPIO_OSPEED_50MHZ, GPIO_PIN_7);	/* PB7引脚配置：开漏输出、50MHz */
	
	IIC_SCL_H;															/* 拉高 */
	IIC_SDA_H;															/* 拉高 */
} 

/**
  * @func	iic_init
  * @param	none
  * @return	none
  */
void iic_start(void)
{
	IIC_SCL_H;
	IIC_SDA_H;
	systick_delay_us(2);
	IIC_SDA_L;				/* SCL保持高电平时，SDA电平由高转低 */
	systick_delay_us(2);
	IIC_SCL_L;
}

/**
  * @func	iic_stop
  * @param	none
  * @return	none
  */
void iic_stop(void)
{
	IIC_SCL_H;
	IIC_SDA_L;
	systick_delay_us(2);
	IIC_SDA_H;				/* SCL保持高电平时，SDA电平由低转高 */
}

/**
  * @func	iic_send_byte
  * @param	none
  * @return	none
  */
void iic_send_byte(uint8_t byte)
{
	int8_t i;
	
	for(i = 7; i >= 0; i--)
	{
		IIC_SCL_L;
		if(byte & BIT(i))
		{
			IIC_SDA_H;		/* 拉高 */
		}
		else
		{
			IIC_SDA_L;		/* 拉低 */
		}
		
		systick_delay_us(2);
		IIC_SCL_H;
		systick_delay_us(2);
	}
	
	IIC_SCL_L;
	IIC_SDA_H;
}

/**
  * @func	iic_read_byte
  * @param	none
  * @return	none
  */
uint8_t iic_read_byte(uint8_t ack)
{
	int8_t i;
	uint8_t byte = 0;
	
	for(i = 7; i >= 0; i--)
	{
		IIC_SCL_L;
		systick_delay_us(2);
		IIC_SCL_H;
		if(IIC_SDA_READ)
		{
			byte |= BIT(i);	
		}
		systick_delay_us(2);
	}
	
	IIC_SCL_L;
	systick_delay_us(2);
	
	if(ack)
	{
		IIC_SDA_L;			/* 拉低 */
		IIC_SCL_H;
		systick_delay_us(2);
		IIC_SCL_L;
		IIC_SDA_H;
		systick_delay_us(2);
	}
	else
	{
		IIC_SDA_H;			/*拉高 */
		IIC_SCL_H;
		systick_delay_us(2);
		IIC_SCL_L;
		systick_delay_us(2);
	}
	
	return byte;
}

/**
  * @func	iic_wait_ack
  * @param	none
  * @return	none
  */
uint8_t iic_wait_ack(int16_t timeout)
{
	do{
		timeout--;
		systick_delay_us(2);
	}while((IIC_SDA_READ) && (timeout >= 0));
	
	if(timeout < 0)
	{
		return 1;		/* 超时 */
	}
	IIC_SCL_H;
	systick_delay_us(2);
	if(IIC_SDA_READ != 0)
	{	
		return 2;		/* 没有应答 */
	}
	IIC_SCL_L;
	systick_delay_us(2);
	
	return 0;
}



